var navigator = {};
var dbits;
var canary=0xdeadbeefcafe;
var j_lm=15715070==(16777215&canary);
function BigInteger(t,e,r){
    if(null!=t)if("number"==typeof t)this.fromNumber(t,e,r);
    else if(null==e&&"string"!=typeof t)this.fromString(t,256);
    else this.fromString(t,e)
}
function nbi(){
    return new BigInteger(null)
}
function am1(n,o,e,r,t,s){
    for(;
    --s>=0;
    ){
        var i=o*this[n++]+e[r]+t;
        t=Math.floor(i/67108864);
        e[r++]=67108863&i
    }
    return t
}
function am2(r,o,f,i,e,h){
    var s=32767&o,a=o>>15;
    for(;
    --h>=0;
    ){
        var t=32767&this[r];
        var u=this[r++]>>15;
        var n=a*t+u*s;
        t=s*t+((32767&n)<<15)+f[i]+(1073741823&e);
        e=(t>>>30)+(n>>>15)+a*u+(e>>>30);
        f[i++]=1073741823&t
    }
    return e
}
function am3(r,o,f,i,e,h){
    var s=16383&o,a=o>>14;
    for(;
    --h>=0;
    ){
        var t=16383&this[r];
        var u=this[r++]>>14;
        var n=a*t+u*s;
        t=s*t+((16383&n)<<14)+f[i]+e;
        e=(t>>28)+(n>>14)+a*u;
        f[i++]=268435455&t
    }
    return e
}
if(j_lm&&"Microsoft Internet Explorer"==navigator.appName){
    BigInteger.prototype.am=am2;
    dbits=30
}
else if(j_lm&&"Netscape"!=navigator.appName){
    BigInteger.prototype.am=am1;
    dbits=26
}
else{
    BigInteger.prototype.am=am3;
    dbits=28
}
BigInteger.prototype.DB=dbits;
BigInteger.prototype.DM=(1<<dbits)-1;
BigInteger.prototype.DV=1<<dbits;
var BI_FP=52;
BigInteger.prototype.FV=Math.pow(2,BI_FP);
BigInteger.prototype.F1=BI_FP-dbits;
BigInteger.prototype.F2=2*dbits-BI_FP;
var BI_RM="0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC=new Array;
var rr,vv;
rr="0".charCodeAt(0);
for(vv=0;
9>=vv;
++vv)BI_RC[rr++]=vv;
rr="a".charCodeAt(0);
for(vv=10;
36>vv;
++vv)BI_RC[rr++]=vv;
rr="A".charCodeAt(0);
for(vv=10;
36>vv;
++vv)BI_RC[rr++]=vv;
function int2char(t){
    return BI_RM.charAt(t)
}
function intAt(e,r){
    var t=BI_RC[e.charCodeAt(r)];
    return null==t?-1:t
}
function bnpCopyTo(e){
    for(var t=this.t-1;
    t>=0;
    --t)e[t]=this[t];
    e.t=this.t;
    e.s=this.s
}
function bnpFromInt(t){
    this.t=1;
    this.s=0>t?-1:0;
    if(t>0)this[0]=t;
    else if(-1>t)this[0]=t+DV;
    else this.t=0
}
function nbv(e){
    var t=nbi();
    t.fromInt(e);
    return t
}
function bnpFromString(i,r){
    var e;
    if(16==r)e=4;
    else if(8==r)e=3;
    else if(256==r)e=8;
    else if(2==r)e=1;
    else if(32==r)e=5;
    else if(4==r)e=2;
    else{
        this.fromRadix(i,r);
        return
    }
    this.t=0;
    this.s=0;
    var o=i.length,s=!1,t=0;
    for(;
    --o>=0;
    ){
        var n=8==e?255&i[o]:intAt(i,o);
        if(!(0>n)){
            s=!1;
            if(0==t)this[this.t++]=n;
            else if(t+e>this.DB){
                this[this.t-1]|=(n&(1<<this.DB-t)-1)<<t;
                this[this.t++]=n>>this.DB-t
            }
            else this[this.t-1]|=n<<t;
            t+=e;
            if(t>=this.DB)t-=this.DB
        }
        else if("-"==i.charAt(o))s=!0
    }
    if(8==e&&0!=(128&i[0])){
        this.s=-1;
        if(t>0)this[this.t-1]|=(1<<this.DB-t)-1<<t
    }
    this.clamp();
    if(s)BigInteger.ZERO.subTo(this,this)
}
function bnpClamp(){
    var t=this.s&this.DM;
    for(;
    this.t>0&&this[this.t-1]==t;
    )--this.t
}
function bnToString(i){
    if(this.s<0)return"-"+this.negate().toString(i);
    var t;
    if(16==i)t=4;
    else if(8==i)t=3;
    else if(2==i)t=1;
    else if(32==i)t=5;
    else if(4==i)t=2;
    else return this.toRadix(i);
    var a=(1<<t)-1,n,o=!1,s="",r=this.t;
    var e=this.DB-r*this.DB%t;
    if(r-- >0){
        if(e<this.DB&&(n=this[r]>>e)>0){
            o=!0;
            s=int2char(n)
        }
        for(;
        r>=0;
        ){
            if(t>e){
                n=(this[r]&(1<<e)-1)<<t-e;
                n|=this[--r]>>(e+=this.DB-t)
            }
            else{
                n=this[r]>>(e-=t)&a;
                if(0>=e){
                    e+=this.DB;
                    --r
                }
                
            }
            if(n>0)o=!0;
            if(o)s+=int2char(n)
        }
        
    }
    return o?s:"0"
}
function bnNegate(){
    var t=nbi();
    BigInteger.ZERO.subTo(this,t);
    return t
}
function bnAbs(){
    return this.s<0?this.negate():this
}
function bnCompareTo(r){
    var t=this.s-r.s;
    if(0!=t)return t;
    var e=this.t;
    t=e-r.t;
    if(0!=t)return this.s<0?-t:t;
    for(;
    --e>=0;
    )if(0!=(t=this[e]-r[e]))return t;
    return 0
}
function nbits(t){
    var r=1,e;
    if(0!=(e=t>>>16)){
        t=e;
        r+=16
    }
    if(0!=(e=t>>8)){
        t=e;
        r+=8
    }
    if(0!=(e=t>>4)){
        t=e;
        r+=4
    }
    if(0!=(e=t>>2)){
        t=e;
        r+=2
    }
    if(0!=(e=t>>1)){
        t=e;
        r+=1
    }
    return r
}
function bnBitLength(){
    if(this.t<=0)return 0;
    else return this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)
}
function bnpDLShiftTo(r,e){
    var t;
    for(t=this.t-1;
    t>=0;
    --t)e[t+r]=this[t];
    for(t=r-1;
    t>=0;
    --t)e[t]=0;
    e.t=this.t+r;
    e.s=this.s
}
function bnpDRShiftTo(e,r){
    for(var t=e;
    t<this.t;
    ++t)r[t-e]=this[t];
    r.t=Math.max(this.t-e,0);
    r.s=this.s
}
function bnpLShiftTo(o,e){
    var i=o%this.DB;
    var s=this.DB-i;
    var a=(1<<s)-1;
    var r=Math.floor(o/this.DB),n=this.s<<i&this.DM,t;
    for(t=this.t-1;
    t>=0;
    --t){
        e[t+r+1]=this[t]>>s|n;
        n=(this[t]&a)<<i
    }
    for(t=r-1;
    t>=0;
    --t)e[t]=0;
    e[r]=n;
    e.t=this.t+r+1;
    e.s=this.s;
    e.clamp()
}
function bnpRShiftTo(n,t){
    t.s=this.s;
    var e=Math.floor(n/this.DB);
    if(!(e>=this.t)){
        var i=n%this.DB;
        var o=this.DB-i;
        var s=(1<<i)-1;
        t[0]=this[e]>>i;
        for(var r=e+1;
        r<this.t;
        ++r){
            t[r-e-1]|=(this[r]&s)<<o;
            t[r-e]=this[r]>>i
        }
        if(i>0)t[this.t-e-1]|=(this.s&s)<<o;
        t.t=this.t-e;
        t.clamp()
    }
    else t.t=0
}
function bnpSubTo(i,r){
    var e=0,t=0,n=Math.min(i.t,this.t);
    for(;
    n>e;
    ){
        t+=this[e]-i[e];
        r[e++]=t&this.DM;
        t>>=this.DB
    }
    if(i.t<this.t){
        t-=i.s;
        for(;
        e<this.t;
        ){
            t+=this[e];
            r[e++]=t&this.DM;
            t>>=this.DB
        }
        t+=this.s
    }
    else{
        t+=this.s;
        for(;
        e<i.t;
        ){
            t-=i[e];
            r[e++]=t&this.DM;
            t>>=this.DB
        }
        t-=i.s
    }
    r.s=0>t?-1:0;
    if(-1>t)r[e++]=this.DV+t;
    else if(t>0)r[e++]=t;
    r.t=e;
    r.clamp()
}
function bnpMultiplyTo(n,e){
    var r=this.abs(),i=n.abs();
    var t=r.t;
    e.t=t+i.t;
    for(;
    --t>=0;
    )e[t]=0;
    for(t=0;
    t<i.t;
    ++t)e[t+r.t]=r.am(0,i[t],e,t,0,r.t);
    e.s=0;
    e.clamp();
    if(this.s!=n.s)BigInteger.ZERO.subTo(e,e)
}
function bnpSquareTo(r){
    var e=this.abs();
    var t=r.t=2*e.t;
    for(;
    --t>=0;
    )r[t]=0;
    for(t=0;
    t<e.t-1;
    ++t){
        var i=e.am(t,e[t],r,2*t,0,1);
        if((r[t+e.t]+=e.am(t+1,2*e[t],r,2*t+1,i,e.t-t-1))>=e.DV){
            r[t+e.t]-=e.DV;
            r[t+e.t+1]=1
        }
        
    }
    if(r.t>0)r[r.t-1]+=e.am(t,e[t],r,2*t,0,1);
    r.s=0;
    r.clamp()
}
function bnpDivRemTo(g,n,t){
    var o=g.abs();
    if(!(o.t<=0)){
        var p=this.abs();
        if(!(p.t<o.t)){
            if(null==t)t=nbi();
            var e=nbi(),l=this.s,m=g.s;
            var a=this.DB-nbits(o[o.t-1]);
            if(a>0){
                o.lShiftTo(a,e);
                p.lShiftTo(a,t)
            }
            else{
                o.copyTo(e);
                p.copyTo(t)
            }
            var r=e.t;
            var h=e[r-1];
            if(0!=h){
                var c=h*(1<<this.F1)+(r>1?e[r-2]>>this.F2:0);
                var v=this.FV/c,d=(1<<this.F1)/c,b=1<<this.F2;
                var s=t.t,f=s-r,i=null==n?nbi():n;
                e.dlShiftTo(f,i);
                if(t.compareTo(i)>=0){
                    t[t.t++]=1;
                    t.subTo(i,t)
                }
                BigInteger.ONE.dlShiftTo(r,i);
                i.subTo(e,e);
                for(;
                e.t<r;
                )e[e.t++]=0;
                for(;
                --f>=0;
                ){
                    var u=t[--s]==h?this.DM:Math.floor(t[s]*v+(t[s-1]+b)*d);
                    if((t[s]+=e.am(0,u,t,f,0,r))<u){
                        e.dlShiftTo(f,i);
                        t.subTo(i,t);
                        for(;
                        t[s]<--u;
                        )t.subTo(i,t)
                    }
                    
                }
                if(null!=n){
                    t.drShiftTo(r,n);
                    if(l!=m)BigInteger.ZERO.subTo(n,n)
                }
                t.t=r;
                t.clamp();
                if(a>0)t.rShiftTo(a,t);
                if(0>l)BigInteger.ZERO.subTo(t,t)
            }
            
        }
        else{
            if(null!=n)n.fromInt(0);
            if(null!=t)this.copyTo(t)
        }
        
    }
    
}
function bnMod(e){
    var t=nbi();
    this.abs().divRemTo(e,null,t);
    if(this.s<0&&t.compareTo(BigInteger.ZERO)>0)e.subTo(t,t);
    return t
}
function Classic(t){
    this.m=t
}
function cConvert(t){
    if(t.s<0||t.compareTo(this.m)>=0)return t.mod(this.m);
    else return t
}
function cRevert(t){
    return t
}
function cReduce(t){
    t.divRemTo(this.m,null,t)
}
function cMulTo(e,r,t){
    e.multiplyTo(r,t);
    this.reduce(t)
}
function cSqrTo(e,t){
    e.squareTo(t);
    this.reduce(t)
}
Classic.prototype.convert=cConvert;
Classic.prototype.revert=cRevert;
Classic.prototype.reduce=cReduce;
Classic.prototype.mulTo=cMulTo;
Classic.prototype.sqrTo=cSqrTo;
function bnpInvDigit(){
    if(this.t<1)return 0;
    var e=this[0];
    if(0==(1&e))return 0;
    var t=3&e;
    t=t*(2-(15&e)*t)&15;
    t=t*(2-(255&e)*t)&255;
    t=t*(2-((65535&e)*t&65535))&65535;
    t=t*(2-e*t%this.DV)%this.DV;
    return t>0?this.DV-t:-t
}
function Montgomery(t){
    this.m=t;
    this.mp=t.invDigit();
    this.mpl=32767&this.mp;
    this.mph=this.mp>>15;
    this.um=(1<<t.DB-15)-1;
    this.mt2=2*t.t
}
function montConvert(e){
    var t=nbi();
    e.abs().dlShiftTo(this.m.t,t);
    t.divRemTo(this.m,null,t);
    if(e.s<0&&t.compareTo(BigInteger.ZERO)>0)this.m.subTo(t,t);
    return t
}
function montRevert(e){
    var t=nbi();
    e.copyTo(t);
    this.reduce(t);
    return t
}
function montReduce(t){
    for(;
    t.t<=this.mt2;
    )t[t.t++]=0;
    for(var r=0;
    r<this.m.t;
    ++r){
        var e=32767&t[r];
        var i=e*this.mpl+((e*this.mph+(t[r]>>15)*this.mpl&this.um)<<15)&t.DM;
        e=r+this.m.t;
        t[e]+=this.m.am(0,i,t,r,0,this.m.t);
        for(;
        t[e]>=t.DV;
        ){
            t[e]-=t.DV;
            t[++e]++
        }
        
    }
    t.clamp();
    t.drShiftTo(this.m.t,t);
    if(t.compareTo(this.m)>=0)t.subTo(this.m,t)
}
function montSqrTo(e,t){
    e.squareTo(t);
    this.reduce(t)
}
function montMulTo(e,r,t){
    e.multiplyTo(r,t);
    this.reduce(t)
}
Montgomery.prototype.convert=montConvert;
Montgomery.prototype.revert=montRevert;
Montgomery.prototype.reduce=montReduce;
Montgomery.prototype.mulTo=montMulTo;
Montgomery.prototype.sqrTo=montSqrTo;
function bnpIsEven(){
    return 0==(this.t>0?1&this[0]:this.s)
}
function bnpExp(e,r){
    if(e>4294967295||1>e)return BigInteger.ONE;
    var t=nbi(),i=nbi(),n=r.convert(this),o=nbits(e)-1;
    n.copyTo(t);
    for(;
    --o>=0;
    ){
        r.sqrTo(t,i);
        if((e&1<<o)>0)r.mulTo(i,n,t);
        else{
            var s=t;
            t=i;
            i=s
        }
        
    }
    return r.revert(t)
}
function bnModPowInt(r,t){
    var e;
    if(256>r||t.isEven())e=new Classic(t);
    else e=new Montgomery(t);
    return this.exp(r,e)
}
BigInteger.prototype.copyTo=bnpCopyTo;
BigInteger.prototype.fromInt=bnpFromInt;
BigInteger.prototype.fromString=bnpFromString;
BigInteger.prototype.clamp=bnpClamp;
BigInteger.prototype.dlShiftTo=bnpDLShiftTo;
BigInteger.prototype.drShiftTo=bnpDRShiftTo;
BigInteger.prototype.lShiftTo=bnpLShiftTo;
BigInteger.prototype.rShiftTo=bnpRShiftTo;
BigInteger.prototype.subTo=bnpSubTo;
BigInteger.prototype.multiplyTo=bnpMultiplyTo;
BigInteger.prototype.squareTo=bnpSquareTo;
BigInteger.prototype.divRemTo=bnpDivRemTo;
BigInteger.prototype.invDigit=bnpInvDigit;
BigInteger.prototype.isEven=bnpIsEven;
BigInteger.prototype.exp=bnpExp;
BigInteger.prototype.toString=bnToString;
BigInteger.prototype.negate=bnNegate;
BigInteger.prototype.abs=bnAbs;
BigInteger.prototype.compareTo=bnCompareTo;
BigInteger.prototype.bitLength=bnBitLength;
BigInteger.prototype.mod=bnMod;
BigInteger.prototype.modPowInt=bnModPowInt;
BigInteger.ZERO=nbv(0);
BigInteger.ONE=nbv(1);
function bnClone(){
    var t=nbi();
    this.copyTo(t);
    return t
}
function bnIntValue(){
    if(this.s<0){
        if(1==this.t)return this[0]-this.DV;
        else if(0==this.t)return-1
    }
    else if(1==this.t)return this[0];
    else if(0==this.t)return 0;
    return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]
}
function bnByteValue(){
    return 0==this.t?this.s:this[0]<<24>>24
}
function bnShortValue(){
    return 0==this.t?this.s:this[0]<<16>>16
}
function bnpChunkSize(t){
    return Math.floor(Math.LN2*this.DB/Math.log(t))
}
function bnSigNum(){
    if(this.s<0)return-1;
    else if(this.t<=0||1==this.t&&this[0]<=0)return 0;
    else return 1
}
function bnpToRadix(t){
    if(null==t)t=10;
    if(0==this.signum()||2>t||t>36)return"0";
    var s=this.chunkSize(t);
    var n=Math.pow(t,s);
    var o=nbv(n),e=nbi(),r=nbi(),i="";
    this.divRemTo(o,e,r);
    for(;
    e.signum()>0;
    ){
        i=(n+r.intValue()).toString(t).substr(1)+i;
        e.divRemTo(o,e,r)
    }
    return r.intValue().toString(t)+i
}
function bnpFromRadix(n,t){
    this.fromInt(0);
    if(null==t)t=10;
    var o=this.chunkSize(t);
    var f=Math.pow(t,o),s=!1,r=0,e=0;
    for(var i=0;
    i<n.length;
    ++i){
        var a=intAt(n,i);
        if(!(0>a)){
            e=t*e+a;
            if(++r>=o){
                this.dMultiply(f);
                this.dAddOffset(e,0);
                r=0;
                e=0
            }
            
        }
        else if("-"==n.charAt(i)&&0==this.signum())s=!0
    }
    if(r>0){
        this.dMultiply(Math.pow(t,r));
        this.dAddOffset(e,0)
    }
    if(s)BigInteger.ZERO.subTo(this,this)
}
function bnpFromNumber(t,r,n){
    if("number"==typeof r)if(2>t)this.fromInt(1);
    else{
        this.fromNumber(t,n);
        if(!this.testBit(t-1))this.bitwiseTo(BigInteger.ONE.shiftLeft(t-1),op_or,this);
        if(this.isEven())this.dAddOffset(1,0);
        for(;
        !this.isProbablePrime(r);
        ){
            this.dAddOffset(2,0);
            if(this.bitLength()>t)this.subTo(BigInteger.ONE.shiftLeft(t-1),this)
        }
        
    }
    else{
        var e=new Array,i=7&t;
        e.length=(t>>3)+1;
        r.nextBytes(e);
        if(i>0)e[0]&=(1<<i)-1;
        else e[0]=0;
        this.fromString(e,256)
    }
    
}
function bnToByteArray(){
    var r=this.t,n=new Array;
    n[0]=this.s;
    var t=this.DB-r*this.DB%8,e,i=0;
    if(r-- >0){
        if(t<this.DB&&(e=this[r]>>t)!=(this.s&this.DM)>>t)n[i++]=e|this.s<<this.DB-t;
        for(;
        r>=0;
        ){
            if(8>t){
                e=(this[r]&(1<<t)-1)<<8-t;
                e|=this[--r]>>(t+=this.DB-8)
            }
            else{
                e=this[r]>>(t-=8)&255;
                if(0>=t){
                    t+=this.DB;
                    --r
                }
                
            }
            if(0!=(128&e))e|=-256;
            if(0==i&&(128&this.s)!=(128&e))++i;
            if(i>0||e!=this.s)n[i++]=e
        }
        
    }
    return n
}
function bnEquals(t){
    return 0==this.compareTo(t)
}
function bnMin(t){
    return this.compareTo(t)<0?this:t
}
function bnMax(t){
    return this.compareTo(t)>0?this:t
}
function bnpBitwiseTo(e,i,r){
    var t,n,o=Math.min(e.t,this.t);
    for(t=0;
    o>t;
    ++t)r[t]=i(this[t],e[t]);
    if(e.t<this.t){
        n=e.s&this.DM;
        for(t=o;
        t<this.t;
        ++t)r[t]=i(this[t],n);
        r.t=this.t
    }
    else{
        n=this.s&this.DM;
        for(t=o;
        t<e.t;
        ++t)r[t]=i(n,e[t]);
        r.t=e.t
    }
    r.s=i(this.s,e.s);
    r.clamp()
}
function op_and(t,e){
    return t&e
}
function bnAnd(e){
    var t=nbi();
    this.bitwiseTo(e,op_and,t);
    return t
}
function op_or(t,e){
    return t|e
}
function bnOr(e){
    var t=nbi();
    this.bitwiseTo(e,op_or,t);
    return t
}
function op_xor(t,e){
    return t^e
}
function bnXor(e){
    var t=nbi();
    this.bitwiseTo(e,op_xor,t);
    return t
}
function op_andnot(t,e){
    return t&~e
}
function bnAndNot(e){
    var t=nbi();
    this.bitwiseTo(e,op_andnot,t);
    return t
}
function bnNot(){
    var t=nbi();
    for(var e=0;
    e<this.t;
    ++e)t[e]=this.DM&~this[e];
    t.t=this.t;
    t.s=~this.s;
    return t
}
function bnShiftLeft(t){
    var e=nbi();
    if(0>t)this.rShiftTo(-t,e);
    else this.lShiftTo(t,e);
    return e
}
function bnShiftRight(t){
    var e=nbi();
    if(0>t)this.lShiftTo(-t,e);
    else this.rShiftTo(t,e);
    return e
}
function lbit(t){
    if(0==t)return-1;
    var e=0;
    if(0==(65535&t)){
        t>>=16;
        e+=16
    }
    if(0==(255&t)){
        t>>=8;
        e+=8
    }
    if(0==(15&t)){
        t>>=4;
        e+=4
    }
    if(0==(3&t)){
        t>>=2;
        e+=2
    }
    if(0==(1&t))++e;
    return e
}
function bnGetLowestSetBit(){
    for(var t=0;
    t<this.t;
    ++t)if(0!=this[t])return t*this.DB+lbit(this[t]);
    if(this.s<0)return this.t*this.DB;
    else return-1
}
function cbit(t){
    var e=0;
    for(;
    0!=t;
    ){
        t&=t-1;
        ++e
    }
    return e
}
function bnBitCount(){
    var e=0,r=this.s&this.DM;
    for(var t=0;
    t<this.t;
    ++t)e+=cbit(this[t]^r);
    return e
}
function bnTestBit(t){
    var e=Math.floor(t/this.DB);
    if(e>=this.t)return 0!=this.s;
    else return 0!=(this[e]&1<<t%this.DB)
}
function bnpChangeBit(e,r){
    var t=BigInteger.ONE.shiftLeft(e);
    this.bitwiseTo(t,r,t);
    return t
}
function bnSetBit(t){
    return this.changeBit(t,op_or)
}
function bnClearBit(t){
    return this.changeBit(t,op_andnot)
}
function bnFlipBit(t){
    return this.changeBit(t,op_xor)
}
function bnpAddTo(i,r){
    var e=0,t=0,n=Math.min(i.t,this.t);
    for(;
    n>e;
    ){
        t+=this[e]+i[e];
        r[e++]=t&this.DM;
        t>>=this.DB
    }
    if(i.t<this.t){
        t+=i.s;
        for(;
        e<this.t;
        ){
            t+=this[e];
            r[e++]=t&this.DM;
            t>>=this.DB
        }
        t+=this.s
    }
    else{
        t+=this.s;
        for(;
        e<i.t;
        ){
            t+=i[e];
            r[e++]=t&this.DM;
            t>>=this.DB
        }
        t+=i.s
    }
    r.s=0>t?-1:0;
    if(t>0)r[e++]=t;
    else if(-1>t)r[e++]=this.DV+t;
    r.t=e;
    r.clamp()
}
function bnAdd(e){
    var t=nbi();
    this.addTo(e,t);
    return t
}
function bnSubtract(e){
    var t=nbi();
    this.subTo(e,t);
    return t
}
function bnMultiply(e){
    var t=nbi();
    this.multiplyTo(e,t);
    return t
}
function bnSquare(){
    var t=nbi();
    this.squareTo(t);
    return t
}
function bnDivide(e){
    var t=nbi();
    this.divRemTo(e,t,null);
    return t
}
function bnRemainder(e){
    var t=nbi();
    this.divRemTo(e,null,t);
    return t
}
function bnDivideAndRemainder(r){
    var t=nbi(),e=nbi();
    this.divRemTo(r,t,e);
    return new Array(t,e)
}
function bnpDMultiply(t){
    this[this.t]=this.am(0,t-1,this,0,0,this.t);
    ++this.t;
    this.clamp()
}
function bnpDAddOffset(e,t){
    if(0!=e){
        for(;
        this.t<=t;
        )this[this.t++]=0;
        this[t]+=e;
        for(;
        this[t]>=this.DV;
        ){
            this[t]-=this.DV;
            if(++t>=this.t)this[this.t++]=0;
            ++this[t]
        }
        
    }
    
}
function NullExp(){}function nNop(t){
    return t
}
function nMulTo(t,e,r){
    t.multiplyTo(e,r)
}
function nSqrTo(t,e){
    t.squareTo(e)
}
NullExp.prototype.convert=nNop;
NullExp.prototype.revert=nNop;
NullExp.prototype.mulTo=nMulTo;
NullExp.prototype.sqrTo=nSqrTo;
function bnPow(t){
    return this.exp(t,new NullExp)
}
function bnpMultiplyLowerTo(r,n,e){
    var t=Math.min(this.t+r.t,n);
    e.s=0;
    e.t=t;
    for(;
    t>0;
    )e[--t]=0;
    var i;
    for(i=e.t-this.t;
    i>t;
    ++t)e[t+this.t]=this.am(0,r[t],e,t,0,this.t);
    for(i=Math.min(r.t,n);
    i>t;
    ++t)this.am(0,r[t],e,t,0,n-t);
    e.clamp()
}
function bnpMultiplyUpperTo(i,r,e){
    --r;
    var t=e.t=this.t+i.t-r;
    e.s=0;
    for(;
    --t>=0;
    )e[t]=0;
    for(t=Math.max(r-this.t,0);
    t<i.t;
    ++t)e[this.t+t-r]=this.am(r-t,i[t],e,0,0,this.t+t-r);
    e.clamp();
    e.drShiftTo(1,e)
}
function Barrett(t){
    this.r2=nbi();
    this.q3=nbi();
    BigInteger.ONE.dlShiftTo(2*t.t,this.r2);
    this.mu=this.r2.divide(t);
    this.m=t
}
function barrettConvert(t){
    if(t.s<0||t.t>2*this.m.t)return t.mod(this.m);
    else if(t.compareTo(this.m)<0)return t;
    else{
        var e=nbi();
        t.copyTo(e);
        this.reduce(e);
        return e
    }
    
}
function barrettRevert(t){
    return t
}
function barrettReduce(t){
    t.drShiftTo(this.m.t-1,this.r2);
    if(t.t>this.m.t+1){
        t.t=this.m.t+1;
        t.clamp()
    }
    this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
    this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
    for(;
    t.compareTo(this.r2)<0;
    )t.dAddOffset(1,this.m.t+1);
    t.subTo(this.r2,t);
    for(;
    t.compareTo(this.m)>=0;
    )t.subTo(this.m,t)
}
function barrettSqrTo(e,t){
    e.squareTo(t);
    this.reduce(t)
}
function barrettMulTo(e,r,t){
    e.multiplyTo(r,t);
    this.reduce(t)
}
Barrett.prototype.convert=barrettConvert;
Barrett.prototype.revert=barrettRevert;
Barrett.prototype.reduce=barrettReduce;
Barrett.prototype.mulTo=barrettMulTo;
Barrett.prototype.sqrTo=barrettSqrTo;
function bnModPow(a,h){
    var t=a.bitLength(),o,e=nbv(1),r;
    if(0>=t)return e;
    else if(18>t)o=1;
    else if(48>t)o=3;
    else if(144>t)o=4;
    else if(768>t)o=5;
    else o=6;
    if(8>t)r=new Classic(h);
    else if(h.isEven())r=new Barrett(h);
    else r=new Montgomery(h);
    var f=new Array,i=3,c=o-1,v=(1<<o)-1;
    f[1]=r.convert(this);
    if(o>1){
        var l=nbi();
        r.sqrTo(f[1],l);
        for(;
        v>=i;
        ){
            f[i]=nbi();
            r.mulTo(l,f[i-2],f[i]);
            i+=2
        }
        
    }
    var n=a.t-1,u,g=!0,s=nbi(),p;
    t=nbits(a[n])-1;
    for(;
    n>=0;
    ){
        if(t>=c)u=a[n]>>t-c&v;
        else{
            u=(a[n]&(1<<t+1)-1)<<c-t;
            if(n>0)u|=a[n-1]>>this.DB+t-c
        }
        i=o;
        for(;
        0==(1&u);
        ){
            u>>=1;
            --i
        }
        if((t-=i)<0){
            t+=this.DB;
            --n
        }
        if(g){
            f[u].copyTo(e);
            g=!1
        }
        else{
            for(;
            i>1;
            ){
                r.sqrTo(e,s);
                r.sqrTo(s,e);
                i-=2
            }
            if(i>0)r.sqrTo(e,s);
            else{
                p=e;
                e=s;
                s=p
            }
            r.mulTo(s,f[u],e)
        }
        for(;
        n>=0&&0==(a[n]&1<<t);
        ){
            r.sqrTo(e,s);
            p=e;
            e=s;
            s=p;
            if(--t<0){
                t=this.DB-1;
                --n
            }
            
        }
        
    }
    return r.revert(e)
}
function bnGCD(n){
    var e=this.s<0?this.negate():this.clone();
    var t=n.s<0?n.negate():n.clone();
    if(e.compareTo(t)<0){
        var o=e;
        e=t;
        t=o
    }
    var i=e.getLowestSetBit(),r=t.getLowestSetBit();
    if(0>r)return e;
    if(r>i)r=i;
    if(r>0){
        e.rShiftTo(r,e);
        t.rShiftTo(r,t)
    }
    for(;
    e.signum()>0;
    ){
        if((i=e.getLowestSetBit())>0)e.rShiftTo(i,e);
        if((i=t.getLowestSetBit())>0)t.rShiftTo(i,t);
        if(e.compareTo(t)>=0){
            e.subTo(t,e);
            e.rShiftTo(1,e)
        }
        else{
            t.subTo(e,t);
            t.rShiftTo(1,t)
        }
        
    }
    if(r>0)t.lShiftTo(r,t);
    return t
}
function bnpModInt(t){
    if(0>=t)return 0;
    var i=this.DV%t,e=this.s<0?t-1:0;
    if(this.t>0)if(0==i)e=this[0]%t;
    else for(var r=this.t-1;
    r>=0;
    --r)e=(i*e+this[r])%t;
    return e
}
function bnModInverse(e){
    var a=e.isEven();
    if(this.isEven()&&a||0==e.signum())return BigInteger.ZERO;
    var i=e.clone(),n=this.clone();
    var o=nbv(1),r=nbv(0),s=nbv(0),t=nbv(1);
    for(;
    0!=i.signum();
    ){
        for(;
        i.isEven();
        ){
            i.rShiftTo(1,i);
            if(a){
                if(!o.isEven()||!r.isEven()){
                    o.addTo(this,o);
                    r.subTo(e,r)
                }
                o.rShiftTo(1,o)
            }
            else if(!r.isEven())r.subTo(e,r);
            r.rShiftTo(1,r)
        }
        for(;
        n.isEven();
        ){
            n.rShiftTo(1,n);
            if(a){
                if(!s.isEven()||!t.isEven()){
                    s.addTo(this,s);
                    t.subTo(e,t)
                }
                s.rShiftTo(1,s)
            }
            else if(!t.isEven())t.subTo(e,t);
            t.rShiftTo(1,t)
        }
        if(i.compareTo(n)>=0){
            i.subTo(n,i);
            if(a)o.subTo(s,o);
            r.subTo(t,r)
        }
        else{
            n.subTo(i,n);
            if(a)s.subTo(o,s);
            t.subTo(r,t)
        }
        
    }
    if(0!=n.compareTo(BigInteger.ONE))return BigInteger.ZERO;
    if(t.compareTo(e)>=0)return t.subtract(e);
    if(t.signum()<0)t.addTo(e,t);
    else return t;
    if(t.signum()<0)return t.add(e);
    else return t
}
var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];
var lplim=(1<<26)/lowprimes[lowprimes.length-1];
function bnIsProbablePrime(n){
    var t,e=this.abs();
    if(1==e.t&&e[0]<=lowprimes[lowprimes.length-1]){
        for(t=0;
        t<lowprimes.length;
        ++t)if(e[0]==lowprimes[t])return!0;
        return!1
    }
    if(e.isEven())return!1;
    t=1;
    for(;
    t<lowprimes.length;
    ){
        var r=lowprimes[t],i=t+1;
        for(;
        i<lowprimes.length&&lplim>r;
        )r*=lowprimes[i++];
        r=e.modInt(r);
        for(;
        i>t;
        )if(r%lowprimes[t++]==0)return!1
    }
    return e.millerRabin(n)
}
function bnpMillerRabin(e){
    var r=this.subtract(BigInteger.ONE);
    var i=r.getLowestSetBit();
    if(0>=i)return!1;
    var s=r.shiftRight(i);
    e=e+1>>1;
    if(e>lowprimes.length)e=lowprimes.length;
    var n=nbi();
    for(var o=0;
    e>o;
    ++o){
        n.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);
        var t=n.modPow(s,this);
        if(0!=t.compareTo(BigInteger.ONE)&&0!=t.compareTo(r)){
            var a=1;
            for(;
            a++<i&&0!=t.compareTo(r);
            ){
                t=t.modPowInt(2,this);
                if(0==t.compareTo(BigInteger.ONE))return!1
            }
            if(0!=t.compareTo(r))return!1
        }
        
    }
    return!0
}
BigInteger.prototype.chunkSize=bnpChunkSize;
BigInteger.prototype.toRadix=bnpToRadix;
BigInteger.prototype.fromRadix=bnpFromRadix;
BigInteger.prototype.fromNumber=bnpFromNumber;
BigInteger.prototype.bitwiseTo=bnpBitwiseTo;
BigInteger.prototype.changeBit=bnpChangeBit;
BigInteger.prototype.addTo=bnpAddTo;
BigInteger.prototype.dMultiply=bnpDMultiply;
BigInteger.prototype.dAddOffset=bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo=bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo=bnpMultiplyUpperTo;
BigInteger.prototype.modInt=bnpModInt;
BigInteger.prototype.millerRabin=bnpMillerRabin;
BigInteger.prototype.clone=bnClone;
BigInteger.prototype.intValue=bnIntValue;
BigInteger.prototype.byteValue=bnByteValue;
BigInteger.prototype.shortValue=bnShortValue;
BigInteger.prototype.signum=bnSigNum;
BigInteger.prototype.toByteArray=bnToByteArray;
BigInteger.prototype.equals=bnEquals;
BigInteger.prototype.min=bnMin;
BigInteger.prototype.max=bnMax;
BigInteger.prototype.and=bnAnd;
BigInteger.prototype.or=bnOr;
BigInteger.prototype.xor=bnXor;
BigInteger.prototype.andNot=bnAndNot;
BigInteger.prototype.not=bnNot;
BigInteger.prototype.shiftLeft=bnShiftLeft;
BigInteger.prototype.shiftRight=bnShiftRight;
BigInteger.prototype.getLowestSetBit=bnGetLowestSetBit;
BigInteger.prototype.bitCount=bnBitCount;
BigInteger.prototype.testBit=bnTestBit;
BigInteger.prototype.setBit=bnSetBit;
BigInteger.prototype.clearBit=bnClearBit;
BigInteger.prototype.flipBit=bnFlipBit;
BigInteger.prototype.add=bnAdd;
BigInteger.prototype.subtract=bnSubtract;
BigInteger.prototype.multiply=bnMultiply;
BigInteger.prototype.divide=bnDivide;
BigInteger.prototype.remainder=bnRemainder;
BigInteger.prototype.divideAndRemainder=bnDivideAndRemainder;
BigInteger.prototype.modPow=bnModPow;
BigInteger.prototype.modInverse=bnModInverse;
BigInteger.prototype.pow=bnPow;
BigInteger.prototype.gcd=bnGCD;
BigInteger.prototype.isProbablePrime=bnIsProbablePrime;
BigInteger.prototype.square=bnSquare;
if("object"!=typeof JSON)JSON={};
!function(){
    "use strict";
    function f(t){
        return 10>t?"0"+t:t
    }
    function quote(t){
        escapable.lastIndex=0;
        return escapable.test(t)?'"'+t.replace(escapable,function(t){
            var e=meta[t];
            return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)
        })+'"':'"'+t+'"'
    }
    function str(a,f){
        var e,n,r,o,s=gap,i,t=f[a];
        if(t&&"object"==typeof t&&"function"==typeof t.toJSON)t=t.toJSON(a);
        if("function"==typeof rep)t=rep.call(f,a,t);
        switch(typeof t){
            case"string":return quote(t);
            case"number":return isFinite(t)?String(t):"null";
            case"boolean":case"null":return String(t);
            case"object":if(!t)return"null";
            gap+=indent;
            i=[];
            if("[object Array]"===Object.prototype.toString.apply(t)){
                o=t.length;
                for(e=0;
                o>e;
                e+=1)i[e]=str(e,t)||"null";
                r=0===i.length?"[]":gap?"[\n"+gap+i.join(",\n"+gap)+"\n"+s+"]":"["+i.join(",")+"]";
                gap=s;
                return r
            }
            if(rep&&"object"==typeof rep){
                o=rep.length;
                for(e=0;
                o>e;
                e+=1)if("string"==typeof rep[e]){
                    n=rep[e];
                    r=str(n,t);
                    if(r)i.push(quote(n)+(gap?": ":":")+r)
                }
                
            }
            else for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)){
                r=str(n,t);
                if(r)i.push(quote(n)+(gap?": ":":")+r)
            }
            r=0===i.length?"{}":gap?"{\n"+gap+i.join(",\n"+gap)+"\n"+s+"}":"{"+i.join(",")+"}";
            gap=s;
            return r
        }
        
    }
    if("function"!=typeof Date.prototype.toJSON){
        Date.prototype.toJSON=function(){
            return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null
        };
        String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){
            return this.valueOf()
        }
        
    }
    var cx,escapable,gap,indent,meta,rep;
    if("function"!=typeof JSON.stringify){
        escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
        meta={
            "\b":"\\b","	":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"
        };
        JSON.stringify=function(i,t,e){
            var r;
            gap="";
            indent="";
            if("number"==typeof e)for(r=0;
            e>r;
            r+=1)indent+=" ";
            else if("string"==typeof e)indent=e;
            rep=t;
            if(t&&"function"!=typeof t&&("object"!=typeof t||"number"!=typeof t.length))throw new Error("JSON.stringify");
            return str("",{
                "":i
            })
        }
        
    }
    if("function"!=typeof JSON.parse){
        cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
        JSON.parse=function(text,reviver){
            function walk(i,n){
                var e,r,t=i[n];
                if(t&&"object"==typeof t)for(e in t)if(Object.prototype.hasOwnProperty.call(t,e)){
                    r=walk(t,e);
                    if(void 0!==r)t[e]=r;
                    else delete t[e]
                }
                return reviver.call(i,n,t)
            }
            var j;
            text=String(text);
            cx.lastIndex=0;
            if(cx.test(text))text=text.replace(cx,function(t){
                return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)
            });
            if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){
                j=eval("("+text+")");
                return"function"==typeof reviver?walk({
                    "":j
                }
                ,""):j
            }
            throw new SyntaxError("JSON.parse")
        }
        
    }
    
}
();
var RSAPublicKey=function(t,e){
    this.modulus=new BigInteger(Hex.encode(t),16);
    this.encryptionExponent=new BigInteger(Hex.encode(e),16)
};
var UTF8={
    encode:function(r){
        r=r.replace(/\r\n/g,"\n");
        var e="";
        for(var i=0;
        i<r.length;
        i++){
            var t=r.charCodeAt(i);
            if(128>t)e+=String.fromCharCode(t);
            else if(t>127&&2048>t){
                e+=String.fromCharCode(t>>6|192);
                e+=String.fromCharCode(63&t|128)
            }
            else{
                e+=String.fromCharCode(t>>12|224);
                e+=String.fromCharCode(t>>6&63|128);
                e+=String.fromCharCode(63&t|128)
            }
            
        }
        return e
    }
    ,decode:function(r){
        var i="";
        var t=0;
        var e=$c1=$c2=0;
        for(;
        t<r.length;
        ){
            e=r.charCodeAt(t);
            if(128>e){
                i+=String.fromCharCode(e);
                t++
            }
            else if(e>191&&224>e){
                $c2=r.charCodeAt(t+1);
                i+=String.fromCharCode((31&e)<<6|63&$c2);
                t+=2
            }
            else{
                $c2=r.charCodeAt(t+1);
                $c3=r.charCodeAt(t+2);
                i+=String.fromCharCode((15&e)<<12|(63&$c2)<<6|63&$c3);
                t+=3
            }
            
        }
        return i
    }
    
};
var Base64={
    base64:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(t){
        if(!t)return!1;
        var a="";
        var o,e,r;
        var f,u,s,i;
        var n=0;
        do{
            o=t.charCodeAt(n++);
            e=t.charCodeAt(n++);
            r=t.charCodeAt(n++);
            f=o>>2;
            u=(3&o)<<4|e>>4;
            s=(15&e)<<2|r>>6;
            i=63&r;
            if(isNaN(e))s=i=64;
            else if(isNaN(r))i=64;
            a+=this.base64.charAt(f)+this.base64.charAt(u)+this.base64.charAt(s)+this.base64.charAt(i)
        }
        while(n<t.length);
        return a
    }
    ,decode:function(t){
        if(!t)return!1;
        t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");
        var r="";
        var s,n,i,o;
        var e=0;
        do{
            s=this.base64.indexOf(t.charAt(e++));
            n=this.base64.indexOf(t.charAt(e++));
            i=this.base64.indexOf(t.charAt(e++));
            o=this.base64.indexOf(t.charAt(e++));
            r+=String.fromCharCode(s<<2|n>>4);
            if(64!=i)r+=String.fromCharCode((15&n)<<4|i>>2);
            if(64!=o)r+=String.fromCharCode((3&i)<<6|o)
        }
        while(e<t.length);
        return r
    }
    
};
var Hex={
    hex:"0123456789abcdef",encode:function(t){
        if(!t)return!1;
        var r="";
        var e;
        var i=0;
        do{
            e=t.charCodeAt(i++);
            r+=this.hex.charAt(e>>4&15)+this.hex.charAt(15&e)
        }
        while(i<t.length);
        return r
    }
    ,decode:function(t){
        if(!t)return!1;
        t=t.replace(/[^0-9abcdef]/g,"");
        var r="";
        var e=0;
        do r+=String.fromCharCode(this.hex.indexOf(t.charAt(e++))<<4&240|15&this.hex.indexOf(t.charAt(e++)));
        while(e<t.length);
        return r
    }
    
};
var ASN1Data=function(t){
    this.error=!1;
    this.parse=function(t){
        if(!t){
            this.error=!0;
            return null
        }
        var n=[];
        for(;
        t.length>0;
        ){
            var r=t.charCodeAt(0);
            t=t.substr(1);
            var e=0;
            if(5==(31&r))t=t.substr(1);
            else if(128&t.charCodeAt(0)){
                var i=127&t.charCodeAt(0);
                t=t.substr(1);
                if(i>0)e=t.charCodeAt(0);
                if(i>1)e=e<<8|t.charCodeAt(1);
                if(i>2){
                    this.error=!0;
                    return null
                }
                t=t.substr(i)
            }
            else{
                e=t.charCodeAt(0);
                t=t.substr(1)
            }
            var o="";
            if(e){
                if(e>t.length){
                    this.error=!0;
                    return null
                }
                o=t.substr(0,e);
                t=t.substr(e)
            }
            if(32&r)n.push(this.parse(o));
            else n.push(this.value(128&r?4:31&r,o))
        }
        return n
    };
    this.value=function(e,t){
        if(1==e)return t?!0:!1;
        else if(2==e)return t;
        else if(3==e)return this.parse(t.substr(1));
        else if(5==e)return null;
        else if(6==e){
            var r=[];
            var a=t.charCodeAt(0);
            r.push(Math.floor(a/40));
            r.push(a-40*r[0]);
            var i=[];
            var s=0;
            var n;
            for(n=1;
            n<t.length;
            n++){
                var f=t.charCodeAt(n);
                i.push(127&f);
                if(128&f)s++;
                else{
                    var o;
                    var u=0;
                    for(o=0;
                    o<i.length;
                    o++)u+=i[o]*Math.pow(128,s--);
                    r.push(u);
                    s=0;
                    i=[]
                }
                
            }
            return r.join(".")
        }
        return null
    };
    this.data=this.parse(t)
};
var RSA={
    getPublicKey:function(t){
        if(t.length<50)return!1;
        if("-----BEGIN PUBLIC KEY-----"!=t.substr(0,26))return!1;
        t=t.substr(26);
        if("-----END PUBLIC KEY-----"!=t.substr(t.length-24))return!1;
        t=t.substr(0,t.length-24);
        t=new ASN1Data(Base64.decode(t));
        if(t.error)return!1;
        t=t.data;
        if("1.2.840.113549.1.1.1"==t[0][0][0])return new RSAPublicKey(t[0][1][0][0],t[0][1][0][1]);
        else return!1
    }
    ,encrypt:function(t,e){
        if(!e)return!1;
        var r=e.modulus.bitLength()+7>>3;
        t=this.pkcs1pad2(t,r);
        if(!t)return!1;
        t=t.modPowInt(e.encryptionExponent,e.modulus);
        if(!t)return!1;
        t=t.toString(16);
        for(;
        t.length<2*r;
        )t="0"+t;
        return Base64.encode(Hex.decode(t))
    }
    ,decrypt:function(t){
        var e=new BigInteger(t,16)
    }
    ,pkcs1pad2:function(r,t){
        if(t<r.length+11)return null;
        var e=[];
        var i=r.length-1;
        for(;
        i>=0&&t>0;
        )e[--t]=r.charCodeAt(i--);
        e[--t]=0;
        for(;
        t>2;
        )e[--t]=Math.floor(254*Math.random())+1;
        e[--t]=2;
        e[--t]=0;
        return new BigInteger(e)
    }
    
};
function getEncrypt(t) {
    var e = RSA.getPublicKey("-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5gsH+AA4XWONB5TDcUd+xCz7ejOFHZKlcZDx+pF1i7Gsvi1vjyJoQhRtRSn950x498VUkx7rUxg1/ScBVfrRxQOZ8xFBye3pjAzfb22+RCuYApSVpJ3OO3KsEuKExftz9oFBv3ejxPlYc5yq7YiBO8XlTnQN0Sa4R4qhPO3I2MQIDAQAB-----END PUBLIC KEY-----");
    var p = RSA.encrypt(t, e);
    return p;
}
